/**
 * @file ProductBean.java
 * Projet eCOM 2010 (Miage Descartes)
 * @author Doido Sébastien
 * @version 2
 * @brief Bean relatif au traitement d'un produit
 */
package ecom.beans;

import java.util.Collection;
import java.util.LinkedList;
import javax.ejb.Remote;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * @brief Bean relatif au traitement d'un produit
 * @author Sebastien
 */
@Entity
@Table(name = "PRODUCT")
@Remote(ProductRemote.class)
@NamedQueries({
    @NamedQuery(name = "getAllProducts", query = "select p FROM ProductBean p"),
    @NamedQuery(name = "getAllProductsInCateg", query = "select p FROM ProductBean p where p.category.idCateg = :categ")

})
public class ProductBean implements java.io.Serializable, ProductRemote {

    /**
     * @brief Identifiant unique du produit
     */
    private int productId;

    /**
     * @brief nom du produit
     */
    private String productName;
    
    /**
     * @brief Description du produit
     */
    private String description;
	
    /**
     * @brief Image du produit
     */
    private String image;

    /**
     * @brief Category du produit
     */
    private CategoryBean category;

    /**
     * @brief Lignes d'inventaire associées à ce produit
     */
    private Collection<WarehouseLineBean> stocks;

    public ProductBean() {
        super();
        stocks = new LinkedList<WarehouseLineBean>();
    }

    /**
     * @brief constructeur de produit
     * @param productName : nom
     * @param description : description
     * @param categ : catégorie du produit
     */
    public ProductBean(String productName, String description, CategoryBean categ) {
        this();
        this.productName = productName;
        this.description = description;
        this.category = categ;
    }

    /**
     * @brief constructeur de produit
     * @param productName : nom
     * @param description : description
     * @param categ : catégorie du produit
     * @param image : image
     */
    public ProductBean(String productName, String description, CategoryBean categ, String image) {
        this(productName, description, categ);
        this.image = image;
    }

    /**
     * @brief renvoie l'identifiant unique du produit
     * @return l'identifiant unique du produit
     */
    @Id
    @Column(name = "product_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getProductId() {
        return productId;
    }

    /**
     * @brief Renvoie le nom du produit
     * @return le nom du produit
     */
    public String getProductName() {
        return productName;
    }

    /**
     * @brief Renvoie la description du produit
     * @return la description du produit
     */
    public String getDescription() {
        return description;
    }

    /**
     * @brief Renvoie l'image du produit
     * @return l'image du produit
     */
    public String getImage() {
        return image;
    }

    /**
     * @brief Renvoie les lignes d'inventaire (stock) relatives au produit
     * @return les lignes d'inventaire (stock) relatives au produit
     */
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
    public Collection<WarehouseLineBean> getStocks() {
        return stocks;
    }

    /**
     * @brief Renvoie la catégorie du produit
     * @return la catégorie du produit
     */
    @ManyToOne
    @JoinColumn(name = "id_categ")
    public CategoryBean getCategory() {
        return category;
    }

    public void setProductId(int productId) {
        this.productId = productId;
    }

    public void setCategory(CategoryBean category) {
        this.category = category;
    }

    public void setStocks(Collection<WarehouseLineBean> stocks) {
        this.stocks = stocks;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setImage(String image) {
        this.image = image;
    }
    
    @Override
    public String toString() {
        return this.getProductId() + "  (" + this.getProductName() + ") : " + this.getDescription() + " | " + this.getImage() + " | " + this.getCategory().getName();
    }

    /**
     * @brief Ajout d'une ligne d'inventaire
     * @param store : magasin proposant le produit
     * @param quantity : quantité proposée
     * @param price : prix de vente pour ce magasin
     */
    public void addWarehouseLine(ProductStoreBean store, int quantity, double price) {
        this.getStocks().add(new WarehouseLineBean(store, this, quantity, price));
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }
}
